/*
 * Copyright 2014 Luke Klinker
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.klinker.android.twitter.utils;

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
import android.util.Log;
import android.util.TypedValue;

import com.klinker.android.twitter.adapters.emoji.NatureEmojiAdapter;
import com.klinker.android.twitter.adapters.emoji.OtherEmojiAdapter;
import com.klinker.android.twitter.adapters.emoji.PeopleEmojiAdapter;
import com.klinker.android.twitter.adapters.emoji.ThingsEmojiAdapter;
import com.klinker.android.twitter.adapters.emoji.TransEmojiAdapter;
import com.klinker.android.twitter.settings.AppSettings;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class EmojiUtils {
    private static final Spannable.Factory spannableFactory = Spannable.Factory
            .getInstance();

    private static final Map<Pattern, Integer> emoticons = new HashMap<Pattern, Integer>();

    private static String pack = "com.klinker.android.emoji_keyboard_trial";
    private static Resources res;

    public static final String emojiString = "\u00a9|\u00ae|[\u203c-\u3299]|[\uD83C\uDC04-\uD83C\uDFf0]|[\uD83D\uDC00-\uD83D\uDEc5]";
    public static Pattern emojiPattern = Pattern.compile(emojiString);

    public static boolean ios;

    public static void init(Context context) {
        if (emoticons.size() != 0) {
            Log.v("emoji_utils", "already initialized");
            return;
        }

        ios = false;

        try {
            res = context.getPackageManager().getResourcesForApplication(pack);
        } catch (Exception e) {
            try {
                pack = "com.klinker.android.emoji_keyboard_trial_ios";
                res = context.getPackageManager().getResourcesForApplication(pack);
                ios = true;
            } catch (Exception f) {
                Log.v("emoji_utils", "no emoji keyboard found");
                return;
            }
        }

        if (res == null) {
            return;
        }

        addPattern(emoticons, "\u263A", res.getIdentifier("emoji_u263a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0A", res.getIdentifier("emoji_u1f60a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE00", res.getIdentifier("emoji_u1f600", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE02", res.getIdentifier("emoji_u1f602", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE03", res.getIdentifier("emoji_u1f603", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE04", res.getIdentifier("emoji_u1f604", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE05", res.getIdentifier("emoji_u1f605", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE06", res.getIdentifier("emoji_u1f606", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE07", res.getIdentifier("emoji_u1f607", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE08", res.getIdentifier("emoji_u1f608", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE09", res.getIdentifier("emoji_u1f609", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2F", res.getIdentifier("emoji_u1f62f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE10", res.getIdentifier("emoji_u1f610", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE11", res.getIdentifier("emoji_u1f611", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE15", res.getIdentifier("emoji_u1f615", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE20", res.getIdentifier("emoji_u1f620", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2C", res.getIdentifier("emoji_u1f62c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE21", res.getIdentifier("emoji_u1f621", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE22", res.getIdentifier("emoji_u1f622", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE34", res.getIdentifier("emoji_u1f634", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2E", res.getIdentifier("emoji_u1f62e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE23", res.getIdentifier("emoji_u1f623", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE24", res.getIdentifier("emoji_u1f624", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE25", res.getIdentifier("emoji_u1f625", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE26", res.getIdentifier("emoji_u1f626", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE27", res.getIdentifier("emoji_u1f627", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE28", res.getIdentifier("emoji_u1f628", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE29", res.getIdentifier("emoji_u1f629", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE30", res.getIdentifier("emoji_u1f630", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1F", res.getIdentifier("emoji_u1f61f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE31", res.getIdentifier("emoji_u1f631", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE32", res.getIdentifier("emoji_u1f632", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE35", res.getIdentifier("emoji_u1f635", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE36", res.getIdentifier("emoji_u1f636", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE37", res.getIdentifier("emoji_u1f637", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1E", res.getIdentifier("emoji_u1f61e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE12", res.getIdentifier("emoji_u1f612", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0D", res.getIdentifier("emoji_u1f60d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1b", res.getIdentifier("emoji_u1f61b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1c", res.getIdentifier("emoji_u1f61c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1d", res.getIdentifier("emoji_u1f61d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0b", res.getIdentifier("emoji_u1f60b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE17", res.getIdentifier("emoji_u1f617", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE19", res.getIdentifier("emoji_u1f619", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE18", res.getIdentifier("emoji_u1f618", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE1a", res.getIdentifier("emoji_u1f61a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0e", res.getIdentifier("emoji_u1f60e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2d", res.getIdentifier("emoji_u1f62d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0c", res.getIdentifier("emoji_u1f60c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE16", res.getIdentifier("emoji_u1f616", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE14", res.getIdentifier("emoji_u1f614", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2a", res.getIdentifier("emoji_u1f62a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE0f", res.getIdentifier("emoji_u1f60f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE13", res.getIdentifier("emoji_u1f613", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE2b", res.getIdentifier("emoji_u1f62b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4b", res.getIdentifier("emoji_u1f64b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4c", res.getIdentifier("emoji_u1f64c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4d", res.getIdentifier("emoji_u1f64d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE45", res.getIdentifier("emoji_u1f645", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE46", res.getIdentifier("emoji_u1f646", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE47", res.getIdentifier("emoji_u1f647", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4e", res.getIdentifier("emoji_u1f64e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4f", res.getIdentifier("emoji_u1f64f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3a", res.getIdentifier("emoji_u1f63a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3c", res.getIdentifier("emoji_u1f63c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE38", res.getIdentifier("emoji_u1f638", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE39", res.getIdentifier("emoji_u1f639", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3b", res.getIdentifier("emoji_u1f63b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3d", res.getIdentifier("emoji_u1f63d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3f", res.getIdentifier("emoji_u1f63f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE3e", res.getIdentifier("emoji_u1f63e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE40", res.getIdentifier("emoji_u1f640", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE48", res.getIdentifier("emoji_u1f648", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE49", res.getIdentifier("emoji_u1f649", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE4a", res.getIdentifier("emoji_u1f64a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCA9", res.getIdentifier("emoji_u1f4a9", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC76", res.getIdentifier("emoji_u1f476", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC66", res.getIdentifier("emoji_u1f466", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC66", res.getIdentifier("emoji_u1f467", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC68", res.getIdentifier("emoji_u1f468", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC69", res.getIdentifier("emoji_u1f469", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC74", res.getIdentifier("emoji_u1f474", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC75", res.getIdentifier("emoji_u1f475", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8f", res.getIdentifier("emoji_u1f48f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC91", res.getIdentifier("emoji_u1f491", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6a", res.getIdentifier("emoji_u1f46a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6b", res.getIdentifier("emoji_u1f46b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6c", res.getIdentifier("emoji_u1f46c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6d", res.getIdentifier("emoji_u1f46d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC64", res.getIdentifier("emoji_u1f464", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC65", res.getIdentifier("emoji_u1f465", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6e", res.getIdentifier("emoji_u1f46e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC77", res.getIdentifier("emoji_u1f477", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC81", res.getIdentifier("emoji_u1f481", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC82", res.getIdentifier("emoji_u1f482", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC6f", res.getIdentifier("emoji_u1f46f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC70", res.getIdentifier("emoji_u1f470", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC78", res.getIdentifier("emoji_u1f478", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF85", res.getIdentifier("emoji_u1f385", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7c", res.getIdentifier("emoji_u1f47c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC71", res.getIdentifier("emoji_u1f471", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC72", res.getIdentifier("emoji_u1f472", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC73", res.getIdentifier("emoji_u1f473", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC83", res.getIdentifier("emoji_u1f483", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC86", res.getIdentifier("emoji_u1f486", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC87", res.getIdentifier("emoji_u1f487", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC85", res.getIdentifier("emoji_u1f485", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7b", res.getIdentifier("emoji_u1f47b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC79", res.getIdentifier("emoji_u1f479", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7a", res.getIdentifier("emoji_u1f47a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7d", res.getIdentifier("emoji_u1f47d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7e", res.getIdentifier("emoji_u1f47e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC7f", res.getIdentifier("emoji_u1f47f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC80", res.getIdentifier("emoji_u1f480", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCaa", res.getIdentifier("emoji_u1f4aa", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC40", res.getIdentifier("emoji_u1f440", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC42", res.getIdentifier("emoji_u1f442", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC43", res.getIdentifier("emoji_u1f443", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC63", res.getIdentifier("emoji_u1f463", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC44", res.getIdentifier("emoji_u1f444", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC45", res.getIdentifier("emoji_u1f445", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8b", res.getIdentifier("emoji_u1f48b", "drawable", pack));
        addPattern(emoticons, "\u2764", res.getIdentifier("emoji_u2764", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC99", res.getIdentifier("emoji_u1f499", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9a", res.getIdentifier("emoji_u1f49a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9b", res.getIdentifier("emoji_u1f49b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9c", res.getIdentifier("emoji_u1f49c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC93", res.getIdentifier("emoji_u1f493", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC94", res.getIdentifier("emoji_u1f494", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC95", res.getIdentifier("emoji_u1f495", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC96", res.getIdentifier("emoji_u1f496", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC97", res.getIdentifier("emoji_u1f497", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC98", res.getIdentifier("emoji_u1f498", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9d", res.getIdentifier("emoji_u1f49d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9e", res.getIdentifier("emoji_u1f49e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC9f", res.getIdentifier("emoji_u1f49f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4d", res.getIdentifier("emoji_u1f44d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4e", res.getIdentifier("emoji_u1f44e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4c", res.getIdentifier("emoji_u1f44c", "drawable", pack));
        addPattern(emoticons, "\u270a", res.getIdentifier("emoji_u270a", "drawable", pack));
        addPattern(emoticons, "\u270c", res.getIdentifier("emoji_u270c", "drawable", pack));
        addPattern(emoticons, "\u270b", res.getIdentifier("emoji_u270b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4a", res.getIdentifier("emoji_u1f44a", "drawable", pack));
        addPattern(emoticons, "\u261d", res.getIdentifier("emoji_u261d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC46", res.getIdentifier("emoji_u1f446", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC47", res.getIdentifier("emoji_u1f447", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC48", res.getIdentifier("emoji_u1f448", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC49", res.getIdentifier("emoji_u1f449", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4b", res.getIdentifier("emoji_u1f44b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC4f", res.getIdentifier("emoji_u1f44f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC50", res.getIdentifier("emoji_u1f450", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD30", res.getIdentifier("emoji_u1f530", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC84", res.getIdentifier("emoji_u1f484", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5e", res.getIdentifier("emoji_u1f45e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5f", res.getIdentifier("emoji_u1f45f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC51", res.getIdentifier("emoji_u1f451", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC52", res.getIdentifier("emoji_u1f452", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa9", res.getIdentifier("emoji_u1f3a9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF93", res.getIdentifier("emoji_u1f393", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC53", res.getIdentifier("emoji_u1f453", "drawable", pack));
        addPattern(emoticons, "\u231a", res.getIdentifier("emoji_u231a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC54", res.getIdentifier("emoji_u1f454", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC55", res.getIdentifier("emoji_u1f455", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC56", res.getIdentifier("emoji_u1f456", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC57", res.getIdentifier("emoji_u1f457", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC58", res.getIdentifier("emoji_u1f458", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC59", res.getIdentifier("emoji_u1f459", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC60", res.getIdentifier("emoji_u1f460", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC61", res.getIdentifier("emoji_u1f461", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC62", res.getIdentifier("emoji_u1f462", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5a", res.getIdentifier("emoji_u1f45a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5c", res.getIdentifier("emoji_u1f45c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCbc", res.getIdentifier("emoji_u1f4bc", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF92", res.getIdentifier("emoji_u1f392", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5d", res.getIdentifier("emoji_u1f45d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC5b", res.getIdentifier("emoji_u1f45b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb0", res.getIdentifier("emoji_u1f4b0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb3", res.getIdentifier("emoji_u1f4b3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb2", res.getIdentifier("emoji_u1f4b2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb5", res.getIdentifier("emoji_u1f4b5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb4", res.getIdentifier("emoji_u1f4b4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb6", res.getIdentifier("emoji_u1f4b6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb7", res.getIdentifier("emoji_u1f4b7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb1", res.getIdentifier("emoji_u1f4b1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb8", res.getIdentifier("emoji_u1f4b8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCb9", res.getIdentifier("emoji_u1f4b9", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2b", res.getIdentifier("emoji_u1f52b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2a", res.getIdentifier("emoji_u1f52a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa3", res.getIdentifier("emoji_u1f4a3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC89", res.getIdentifier("emoji_u1f489", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8a", res.getIdentifier("emoji_u1f48a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEac", res.getIdentifier("emoji_u1f6ac", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD14", res.getIdentifier("emoji_u1f514", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD15", res.getIdentifier("emoji_u1f515", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEaa", res.getIdentifier("emoji_u1f6aa", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2c", res.getIdentifier("emoji_u1f52c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2d", res.getIdentifier("emoji_u1f52d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2e", res.getIdentifier("emoji_u1f52e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD26", res.getIdentifier("emoji_u1f526", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD0b", res.getIdentifier("emoji_u1f50b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD0c", res.getIdentifier("emoji_u1f50c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCdc", res.getIdentifier("emoji_u1f4dc", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd7", res.getIdentifier("emoji_u1f4d7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd8", res.getIdentifier("emoji_u1f4d8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd9", res.getIdentifier("emoji_u1f4d9", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCda", res.getIdentifier("emoji_u1f4da", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd4", res.getIdentifier("emoji_u1f4d4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd2", res.getIdentifier("emoji_u1f4d2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd1", res.getIdentifier("emoji_u1f4d1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd3", res.getIdentifier("emoji_u1f4d3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd5", res.getIdentifier("emoji_u1f4d5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd6", res.getIdentifier("emoji_u1f4d6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf0", res.getIdentifier("emoji_u1f4f0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCdb", res.getIdentifier("emoji_u1f4db", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF83", res.getIdentifier("emoji_u1f383", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF84", res.getIdentifier("emoji_u1f384", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF80", res.getIdentifier("emoji_u1f380", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF81", res.getIdentifier("emoji_u1f381", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF82", res.getIdentifier("emoji_u1f382", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF88", res.getIdentifier("emoji_u1f388", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF86", res.getIdentifier("emoji_u1f386", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF87", res.getIdentifier("emoji_u1f387", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF89", res.getIdentifier("emoji_u1f389", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8a", res.getIdentifier("emoji_u1f38a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8d", res.getIdentifier("emoji_u1f38d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8f", res.getIdentifier("emoji_u1f38f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8c", res.getIdentifier("emoji_u1f38c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF90", res.getIdentifier("emoji_u1f390", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8b", res.getIdentifier("emoji_u1f38b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF8e", res.getIdentifier("emoji_u1f38e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf1", res.getIdentifier("emoji_u1f4f1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf2", res.getIdentifier("emoji_u1f4f2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCdf", res.getIdentifier("emoji_u1f4df", "drawable", pack));
        addPattern(emoticons, "\u260e", res.getIdentifier("emoji_u260e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCde", res.getIdentifier("emoji_u1f4de", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe0", res.getIdentifier("emoji_u1f4e0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe6", res.getIdentifier("emoji_u1f4e6", "drawable", pack));
        addPattern(emoticons, "\u2709", res.getIdentifier("emoji_u2709", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe8", res.getIdentifier("emoji_u1f4e8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe9", res.getIdentifier("emoji_u1f4e9", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCea", res.getIdentifier("emoji_u1f4ea", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCeb", res.getIdentifier("emoji_u1f4eb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCed", res.getIdentifier("emoji_u1f4ed", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCec", res.getIdentifier("emoji_u1f4ec", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCee", res.getIdentifier("emoji_u1f4ee", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe4", res.getIdentifier("emoji_u1f4e4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe5", res.getIdentifier("emoji_u1f4e5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCef", res.getIdentifier("emoji_u1f4ef", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe3", res.getIdentifier("emoji_u1f4e3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe2", res.getIdentifier("emoji_u1f4e2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe1", res.getIdentifier("emoji_u1f4e1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCac", res.getIdentifier("emoji_u1f4ac", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCad", res.getIdentifier("emoji_u1f4ad", "drawable", pack));
        addPattern(emoticons, "\u2712", res.getIdentifier("emoji_u2712", "drawable", pack));
        addPattern(emoticons, "\u270f", res.getIdentifier("emoji_u270f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCdd", res.getIdentifier("emoji_u1f4dd", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCcf", res.getIdentifier("emoji_u1f4cf", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCd0", res.getIdentifier("emoji_u1f4d0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCcd", res.getIdentifier("emoji_u1f4cd", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCcc", res.getIdentifier("emoji_u1f4cc", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCce", res.getIdentifier("emoji_u1f4ce", "drawable", pack));
        addPattern(emoticons, "\u2702", res.getIdentifier("emoji_u2702", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCba", res.getIdentifier("emoji_u1f4ba", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCbb", res.getIdentifier("emoji_u1f4bb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCbd", res.getIdentifier("emoji_u1f4bd", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCbe", res.getIdentifier("emoji_u1f4be", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCbf", res.getIdentifier("emoji_u1f4bf", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc6", res.getIdentifier("emoji_u1f4c6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc5", res.getIdentifier("emoji_u1f4c5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc7", res.getIdentifier("emoji_u1f4c7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCcb", res.getIdentifier("emoji_u1f4cb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc1", res.getIdentifier("emoji_u1f4c1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc2", res.getIdentifier("emoji_u1f4c2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc3", res.getIdentifier("emoji_u1f4c3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc4", res.getIdentifier("emoji_u1f4c4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCca", res.getIdentifier("emoji_u1f4ca", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc8", res.getIdentifier("emoji_u1f4c8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc9", res.getIdentifier("emoji_u1f4c9", "drawable", pack));
        addPattern(emoticons, "\u26fa", res.getIdentifier("emoji_u26fa", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa1", res.getIdentifier("emoji_u1f3a1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa1", res.getIdentifier("emoji_u1f3a2", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa0", res.getIdentifier("emoji_u1f3a0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFaa", res.getIdentifier("emoji_u1f3aa", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa8", res.getIdentifier("emoji_u1f3a8", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFac", res.getIdentifier("emoji_u1f3ac", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa5", res.getIdentifier("emoji_u1f3a5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf7", res.getIdentifier("emoji_u1f4f7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf9", res.getIdentifier("emoji_u1f4f9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFad", res.getIdentifier("emoji_u1f3ad", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFab", res.getIdentifier("emoji_u1f3ab", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFae", res.getIdentifier("emoji_u1f3ae", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb2", res.getIdentifier("emoji_u1f3b2", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb0", res.getIdentifier("emoji_u1f3b0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDCCF", res.getIdentifier("emoji_u1f0cf", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb4", res.getIdentifier("emoji_u1f3b4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDC04", res.getIdentifier("emoji_u1f004", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFaf", res.getIdentifier("emoji_u1f3af", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCfa", res.getIdentifier("emoji_u1f4fa", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCfb", res.getIdentifier("emoji_u1f4fb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCc0", res.getIdentifier("emoji_u1f4c0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCfc", res.getIdentifier("emoji_u1f4fc", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa7", res.getIdentifier("emoji_u1f3a7", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa4", res.getIdentifier("emoji_u1f3a4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb5", res.getIdentifier("emoji_u1f3b5", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb6", res.getIdentifier("emoji_u1f3b6", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFbc", res.getIdentifier("emoji_u1f3bc", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFbb", res.getIdentifier("emoji_u1f3bb", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb9", res.getIdentifier("emoji_u1f3b9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb7", res.getIdentifier("emoji_u1f3b7", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFba", res.getIdentifier("emoji_u1f3ba", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb8", res.getIdentifier("emoji_u1f3b8", "drawable", pack));
        addPattern(emoticons, "\u303d", res.getIdentifier("emoji_u303d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC15", res.getIdentifier("emoji_u1f415", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC36", res.getIdentifier("emoji_u1f436", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC29", res.getIdentifier("emoji_u1f429", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC08", res.getIdentifier("emoji_u1f408", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC31", res.getIdentifier("emoji_u1f431", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC00", res.getIdentifier("emoji_u1f400", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC01", res.getIdentifier("emoji_u1f401", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2d", res.getIdentifier("emoji_u1f42d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC39", res.getIdentifier("emoji_u1f439", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC22", res.getIdentifier("emoji_u1f422", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC07", res.getIdentifier("emoji_u1f407", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC30", res.getIdentifier("emoji_u1f430", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC13", res.getIdentifier("emoji_u1f413", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC14", res.getIdentifier("emoji_u1f414", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC23", res.getIdentifier("emoji_u1f423", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC25", res.getIdentifier("emoji_u1f425", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC26", res.getIdentifier("emoji_u1f426", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0f", res.getIdentifier("emoji_u1f40f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC11", res.getIdentifier("emoji_u1f411", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC10", res.getIdentifier("emoji_u1f410", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC3a", res.getIdentifier("emoji_u1f43a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC03", res.getIdentifier("emoji_u1f403", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC02", res.getIdentifier("emoji_u1f402", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC04", res.getIdentifier("emoji_u1f404", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2e", res.getIdentifier("emoji_u1f42e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC34", res.getIdentifier("emoji_u1f434", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC17", res.getIdentifier("emoji_u1f417", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC16", res.getIdentifier("emoji_u1f416", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC37", res.getIdentifier("emoji_u1f437", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC3d", res.getIdentifier("emoji_u1f43d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC38", res.getIdentifier("emoji_u1f438", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0d", res.getIdentifier("emoji_u1f40d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC3c", res.getIdentifier("emoji_u1f43c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC27", res.getIdentifier("emoji_u1f427", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC18", res.getIdentifier("emoji_u1f418", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC28", res.getIdentifier("emoji_u1f428", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC12", res.getIdentifier("emoji_u1f412", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC35", res.getIdentifier("emoji_u1f435", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC06", res.getIdentifier("emoji_u1f406", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2f", res.getIdentifier("emoji_u1f42f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC3b", res.getIdentifier("emoji_u1f43b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2a", res.getIdentifier("emoji_u1f42a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2b", res.getIdentifier("emoji_u1f42b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0a", res.getIdentifier("emoji_u1f40a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC33", res.getIdentifier("emoji_u1f433", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0b", res.getIdentifier("emoji_u1f40b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1f", res.getIdentifier("emoji_u1f41f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC20", res.getIdentifier("emoji_u1f420", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC21", res.getIdentifier("emoji_u1f421", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC19", res.getIdentifier("emoji_u1f419", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1a", res.getIdentifier("emoji_u1f41a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC2c", res.getIdentifier("emoji_u1f42c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0c", res.getIdentifier("emoji_u1f40c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1b", res.getIdentifier("emoji_u1f41b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1c", res.getIdentifier("emoji_u1f41c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1d", res.getIdentifier("emoji_u1f41d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC1e", res.getIdentifier("emoji_u1f41e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC32", res.getIdentifier("emoji_u1f432", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC09", res.getIdentifier("emoji_u1f409", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC3e", res.getIdentifier("emoji_u1f43e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF78", res.getIdentifier("emoji_u1f378", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF7A", res.getIdentifier("emoji_u1f37a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF7b", res.getIdentifier("emoji_u1f37b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF77", res.getIdentifier("emoji_u1f377", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF79", res.getIdentifier("emoji_u1f379", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF76", res.getIdentifier("emoji_u1f376", "drawable", pack));
        addPattern(emoticons, "\u2615", res.getIdentifier("emoji_u2615", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF75", res.getIdentifier("emoji_u1f375", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF7c", res.getIdentifier("emoji_u1f37c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF74", res.getIdentifier("emoji_u1f374", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF68", res.getIdentifier("emoji_u1f368", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF67", res.getIdentifier("emoji_u1f367", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF66", res.getIdentifier("emoji_u1f366", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF65", res.getIdentifier("emoji_u1f369", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF70", res.getIdentifier("emoji_u1f370", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6a", res.getIdentifier("emoji_u1f36a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6b", res.getIdentifier("emoji_u1f36b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6c", res.getIdentifier("emoji_u1f36c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6d", res.getIdentifier("emoji_u1f36d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6e", res.getIdentifier("emoji_u1f36e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF6f", res.getIdentifier("emoji_u1f36f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF73", res.getIdentifier("emoji_u1f373", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF54", res.getIdentifier("emoji_u1f354", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5f", res.getIdentifier("emoji_u1f35f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5d", res.getIdentifier("emoji_u1f35d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF55", res.getIdentifier("emoji_u1f355", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF56", res.getIdentifier("emoji_u1f356", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF57", res.getIdentifier("emoji_u1f357", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF64", res.getIdentifier("emoji_u1f364", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF63", res.getIdentifier("emoji_u1f363", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF71", res.getIdentifier("emoji_u1f371", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5e", res.getIdentifier("emoji_u1f35e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5c", res.getIdentifier("emoji_u1f35c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF59", res.getIdentifier("emoji_u1f359", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5a", res.getIdentifier("emoji_u1f35a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF5b", res.getIdentifier("emoji_u1f35b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF72", res.getIdentifier("emoji_u1f372", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF65", res.getIdentifier("emoji_u1f365", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF62", res.getIdentifier("emoji_u1f362", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF61", res.getIdentifier("emoji_u1f361", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF58", res.getIdentifier("emoji_u1f358", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF60", res.getIdentifier("emoji_u1f360", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4c", res.getIdentifier("emoji_u1f34c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4e", res.getIdentifier("emoji_u1f34e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4f", res.getIdentifier("emoji_u1f34f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4a", res.getIdentifier("emoji_u1f34a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4b", res.getIdentifier("emoji_u1f34b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF44", res.getIdentifier("emoji_u1f344", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF45", res.getIdentifier("emoji_u1f345", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF46", res.getIdentifier("emoji_u1f346", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF47", res.getIdentifier("emoji_u1f347", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF48", res.getIdentifier("emoji_u1f348", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF49", res.getIdentifier("emoji_u1f349", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF50", res.getIdentifier("emoji_u1f350", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF51", res.getIdentifier("emoji_u1f351", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF52", res.getIdentifier("emoji_u1f352", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF53", res.getIdentifier("emoji_u1f353", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF4d", res.getIdentifier("emoji_u1f34d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF30", res.getIdentifier("emoji_u1f330", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF31", res.getIdentifier("emoji_u1f331", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF32", res.getIdentifier("emoji_u1f332", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF33", res.getIdentifier("emoji_u1f333", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF34", res.getIdentifier("emoji_u1f334", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF35", res.getIdentifier("emoji_u1f335", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF37", res.getIdentifier("emoji_u1f337", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF38", res.getIdentifier("emoji_u1f338", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF39", res.getIdentifier("emoji_u1f339", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF40", res.getIdentifier("emoji_u1f340", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF41", res.getIdentifier("emoji_u1f341", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF42", res.getIdentifier("emoji_u1f342", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF43", res.getIdentifier("emoji_u1f343", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3a", res.getIdentifier("emoji_u1f33a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3b", res.getIdentifier("emoji_u1f33b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3c", res.getIdentifier("emoji_u1f33c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3d", res.getIdentifier("emoji_u1f33d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3e", res.getIdentifier("emoji_u1f33e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF3f", res.getIdentifier("emoji_u1f33f", "drawable", pack));
        addPattern(emoticons, "\u2600", res.getIdentifier("emoji_u2600", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF08", res.getIdentifier("emoji_u1f308", "drawable", pack));
        addPattern(emoticons, "\u26c5", res.getIdentifier("emoji_u26c5", "drawable", pack));
        addPattern(emoticons, "\u2601", res.getIdentifier("emoji_u2601", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF01", res.getIdentifier("emoji_u1f301", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF02", res.getIdentifier("emoji_u1f302", "drawable", pack));
        addPattern(emoticons, "\u2614", res.getIdentifier("emoji_u2614", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCA7", res.getIdentifier("emoji_u1f4a7", "drawable", pack));
        addPattern(emoticons, "\u26a1", res.getIdentifier("emoji_u26a1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF00", res.getIdentifier("emoji_u1f300", "drawable", pack));
        addPattern(emoticons, "\u2744", res.getIdentifier("emoji_u2744", "drawable", pack));
        addPattern(emoticons, "\u26c4", res.getIdentifier("emoji_u26c4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF19", res.getIdentifier("emoji_u1f319", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1e", res.getIdentifier("emoji_u1f31e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1d", res.getIdentifier("emoji_u1f31d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1a", res.getIdentifier("emoji_u1f31a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1b", res.getIdentifier("emoji_u1f31b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1c", res.getIdentifier("emoji_u1f31c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF11", res.getIdentifier("emoji_u1f311", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF12", res.getIdentifier("emoji_u1f312", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF13", res.getIdentifier("emoji_u1f313", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF14", res.getIdentifier("emoji_u1f314", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF15", res.getIdentifier("emoji_u1f315", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF16", res.getIdentifier("emoji_u1f316", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF17", res.getIdentifier("emoji_u1f317", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF18", res.getIdentifier("emoji_u1f318", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF91", res.getIdentifier("emoji_u1f391", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF04", res.getIdentifier("emoji_u1f304", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF05", res.getIdentifier("emoji_u1f305", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF07", res.getIdentifier("emoji_u1f307", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF06", res.getIdentifier("emoji_u1f306", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF03", res.getIdentifier("emoji_u1f303", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0c", res.getIdentifier("emoji_u1f30c", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF09", res.getIdentifier("emoji_u1f309", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0a", res.getIdentifier("emoji_u1f30a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0b", res.getIdentifier("emoji_u1f30b", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0e", res.getIdentifier("emoji_u1f30e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0f", res.getIdentifier("emoji_u1f30f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF0d", res.getIdentifier("emoji_u1f30d", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF10", res.getIdentifier("emoji_u1f310", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE0", res.getIdentifier("emoji_u1f3e0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFe1", res.getIdentifier("emoji_u1f3e1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE2", res.getIdentifier("emoji_u1f3e2", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE3", res.getIdentifier("emoji_u1f3e3", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE4", res.getIdentifier("emoji_u1f3e4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE5", res.getIdentifier("emoji_u1f3e5", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFe6", res.getIdentifier("emoji_u1f3e6", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE7", res.getIdentifier("emoji_u1f3e7", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE8", res.getIdentifier("emoji_u1f3e8", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFE9", res.getIdentifier("emoji_u1f3e9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFEa", res.getIdentifier("emoji_u1f3ea", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFeb", res.getIdentifier("emoji_u1f3eb", "drawable", pack));
        addPattern(emoticons, "\u26ea", res.getIdentifier("emoji_u26ea", "drawable", pack));
        addPattern(emoticons, "\u26f2", res.getIdentifier("emoji_u26f2", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFEc", res.getIdentifier("emoji_u1f3ec", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFEf", res.getIdentifier("emoji_u1f3ef", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFf0", res.getIdentifier("emoji_u1f3f0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFEd", res.getIdentifier("emoji_u1f3ed", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDDFB", res.getIdentifier("emoji_u1f5fb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDDFc", res.getIdentifier("emoji_u1f5fc", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC88", res.getIdentifier("emoji_u1f488", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD27", res.getIdentifier("emoji_u1f527", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD28", res.getIdentifier("emoji_u1f528", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD29", res.getIdentifier("emoji_u1f529", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEBF", res.getIdentifier("emoji_u1f6bf", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc1", res.getIdentifier("emoji_u1f6c1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc0", res.getIdentifier("emoji_u1f6c0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEbd", res.getIdentifier("emoji_u1f6bd", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEBe", res.getIdentifier("emoji_u1f6be", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFbd", res.getIdentifier("emoji_u1f3bd", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFa3", res.getIdentifier("emoji_u1f3a3", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb1", res.getIdentifier("emoji_u1f3b1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFb3", res.getIdentifier("emoji_u1f3b3", "drawable", pack));
        addPattern(emoticons, "\u26be", res.getIdentifier("emoji_u26be", "drawable", pack));
        addPattern(emoticons, "\u26f3", res.getIdentifier("emoji_u26f3", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFbe", res.getIdentifier("emoji_u1f3be", "drawable", pack));
        addPattern(emoticons, "\u26bd", res.getIdentifier("emoji_u26bd", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFbf", res.getIdentifier("emoji_u1f3bf", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc0", res.getIdentifier("emoji_u1f3c0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc1", res.getIdentifier("emoji_u1f3c1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc2", res.getIdentifier("emoji_u1f3c2", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc3", res.getIdentifier("emoji_u1f3c3", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc4", res.getIdentifier("emoji_u1f3c4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc6", res.getIdentifier("emoji_u1f3c6", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc7", res.getIdentifier("emoji_u1f3c7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC0E", res.getIdentifier("emoji_u1f40e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc8", res.getIdentifier("emoji_u1f3c8", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFc9", res.getIdentifier("emoji_u1f3c9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDFca", res.getIdentifier("emoji_u1f3ca", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE82", res.getIdentifier("emoji_u1f682", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE84", res.getIdentifier("emoji_u1f684", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE85", res.getIdentifier("emoji_u1f685", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE86", res.getIdentifier("emoji_u1f686", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE87", res.getIdentifier("emoji_u1f687", "drawable", pack));
        addPattern(emoticons, "\u24c2", res.getIdentifier("emoji_u24c2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE88", res.getIdentifier("emoji_u1f688", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8a", res.getIdentifier("emoji_u1f68a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8b", res.getIdentifier("emoji_u1f68b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8c", res.getIdentifier("emoji_u1f68c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8d", res.getIdentifier("emoji_u1f68d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8e", res.getIdentifier("emoji_u1f68e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE8f", res.getIdentifier("emoji_u1f68f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE90", res.getIdentifier("emoji_u1f690", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE91", res.getIdentifier("emoji_u1f691", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE92", res.getIdentifier("emoji_u1f692", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE93", res.getIdentifier("emoji_u1f693", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE94", res.getIdentifier("emoji_u1f694", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE95", res.getIdentifier("emoji_u1f695", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE96", res.getIdentifier("emoji_u1f696", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE97", res.getIdentifier("emoji_u1f697", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE98", res.getIdentifier("emoji_u1f698", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE99", res.getIdentifier("emoji_u1f699", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE9a", res.getIdentifier("emoji_u1f69a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE9b", res.getIdentifier("emoji_u1f69b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE9c", res.getIdentifier("emoji_u1f69c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE9d", res.getIdentifier("emoji_u1f69d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE9f", res.getIdentifier("emoji_u1f69f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa0", res.getIdentifier("emoji_u1f6a0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa1", res.getIdentifier("emoji_u1f6a1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa2", res.getIdentifier("emoji_u1f6a2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa3", res.getIdentifier("emoji_u1f6a3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE81", res.getIdentifier("emoji_u1f681", "drawable", pack));
        addPattern(emoticons, "\u2708", res.getIdentifier("emoji_u2708", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc2", res.getIdentifier("emoji_u1f6c2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc3", res.getIdentifier("emoji_u1f6c3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc4", res.getIdentifier("emoji_u1f6c4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEc5", res.getIdentifier("emoji_u1f6c5", "drawable", pack));
        addPattern(emoticons, "\u26f5", res.getIdentifier("emoji_u26f5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb2", res.getIdentifier("emoji_u1f6b2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb3", res.getIdentifier("emoji_u1f6b3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb4", res.getIdentifier("emoji_u1f6b4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb5", res.getIdentifier("emoji_u1f6b5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb7", res.getIdentifier("emoji_u1f6b7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb8", res.getIdentifier("emoji_u1f6b8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE89", res.getIdentifier("emoji_u1f689", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDE80", res.getIdentifier("emoji_u1f680", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa4", res.getIdentifier("emoji_u1f6a4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb6", res.getIdentifier("emoji_u1f6b6", "drawable", pack));
        addPattern(emoticons, "\u26fd", res.getIdentifier("emoji_u26fd", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD7F", res.getIdentifier("emoji_u1f17f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa5", res.getIdentifier("emoji_u1f6a5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa6", res.getIdentifier("emoji_u1f6a6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa7", res.getIdentifier("emoji_u1f6a7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa8", res.getIdentifier("emoji_u1f6a8", "drawable", pack));
        addPattern(emoticons, "\u2668", res.getIdentifier("emoji_u2668", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8C", res.getIdentifier("emoji_u1f48c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8d", res.getIdentifier("emoji_u1f48d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC8e", res.getIdentifier("emoji_u1f48e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC90", res.getIdentifier("emoji_u1f490", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDC92", res.getIdentifier("emoji_u1f492", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDEF\uD83C\uDDF5", res.getIdentifier("emoji_ufe4e5", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDFA\uD83C\uDDF8", res.getIdentifier("emoji_ufe4e6", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDEB\uD83C\uDDF7", res.getIdentifier("emoji_ufe4e7", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDE9\uD83C\uDDEA", res.getIdentifier("emoji_ufe4e8", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDEE\uD83C\uDDF9", res.getIdentifier("emoji_ufe4e9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDEC\uD83C\uDDE7", res.getIdentifier("emoji_ufe4ea", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDEA\uD83C\uDDF8", res.getIdentifier("emoji_ufe4eb", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDF7\uD83C\uDDFA", res.getIdentifier("emoji_ufe4ec", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDE8\uD83C\uDDF3", res.getIdentifier("emoji_ufe4ed", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDDF0\uD83C\uDDF7", res.getIdentifier("emoji_ufe4ee", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1d", res.getIdentifier("emoji_u1f51d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD19", res.getIdentifier("emoji_u1f519", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1b", res.getIdentifier("emoji_u1f51b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1c", res.getIdentifier("emoji_u1f51c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1a", res.getIdentifier("emoji_u1f51a", "drawable", pack));
        addPattern(emoticons, "\u23f3", res.getIdentifier("emoji_u23f3", "drawable", pack));
        addPattern(emoticons, "\u231b", res.getIdentifier("emoji_u231b", "drawable", pack));
        addPattern(emoticons, "\u23f0", res.getIdentifier("emoji_u23f0", "drawable", pack));
        addPattern(emoticons, "\u2648", res.getIdentifier("emoji_u2648", "drawable", pack));
        addPattern(emoticons, "\u2649", res.getIdentifier("emoji_u2649", "drawable", pack));
        addPattern(emoticons, "\u264a", res.getIdentifier("emoji_u264a", "drawable", pack));
        addPattern(emoticons, "\u264b", res.getIdentifier("emoji_u264b", "drawable", pack));
        addPattern(emoticons, "\u264c", res.getIdentifier("emoji_u264c", "drawable", pack));
        addPattern(emoticons, "\u264d", res.getIdentifier("emoji_u264d", "drawable", pack));
        addPattern(emoticons, "\u264e", res.getIdentifier("emoji_u264e", "drawable", pack));
        addPattern(emoticons, "\u264f", res.getIdentifier("emoji_u264f", "drawable", pack));
        addPattern(emoticons, "\u2650", res.getIdentifier("emoji_u2650", "drawable", pack));
        addPattern(emoticons, "\u2651", res.getIdentifier("emoji_u2651", "drawable", pack));
        addPattern(emoticons, "\u2652", res.getIdentifier("emoji_u2652", "drawable", pack));
        addPattern(emoticons, "\u2653", res.getIdentifier("emoji_u2653", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD31", res.getIdentifier("emoji_u1f531", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD2f", res.getIdentifier("emoji_u1f52f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEbb", res.getIdentifier("emoji_u1f6bb", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEae", res.getIdentifier("emoji_u1f6ae", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEaf", res.getIdentifier("emoji_u1f6af", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb0", res.getIdentifier("emoji_u1f6b0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb1", res.getIdentifier("emoji_u1f6b1", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD70", res.getIdentifier("emoji_u1f170", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD71", res.getIdentifier("emoji_u1f171", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD8e", res.getIdentifier("emoji_u1f18e", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD7e", res.getIdentifier("emoji_u1f17e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCae", res.getIdentifier("emoji_u1f4ae", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCaf", res.getIdentifier("emoji_u1f4af", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD20", res.getIdentifier("emoji_u1f520", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD21", res.getIdentifier("emoji_u1f521", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD22", res.getIdentifier("emoji_u1f522", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD23", res.getIdentifier("emoji_u1f523", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD24", res.getIdentifier("emoji_u1f524", "drawable", pack));
        addPattern(emoticons, "\u27bf", res.getIdentifier("emoji_u27bf", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf6", res.getIdentifier("emoji_u1f4f6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf3", res.getIdentifier("emoji_u1f4f3", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf4", res.getIdentifier("emoji_u1f4f4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCf5", res.getIdentifier("emoji_u1f4f5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEb9", res.getIdentifier("emoji_u1f6b9", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEba", res.getIdentifier("emoji_u1f6ba", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEbc", res.getIdentifier("emoji_u1f6bc", "drawable", pack));
        addPattern(emoticons, "\u267f", res.getIdentifier("emoji_u267f", "drawable", pack));
        addPattern(emoticons, "\u267b", res.getIdentifier("emoji_u267b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEad", res.getIdentifier("emoji_u1f6ad", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEa9", res.getIdentifier("emoji_u1f6a9", "drawable", pack));
        addPattern(emoticons, "\u26a0", res.getIdentifier("emoji_u26a0", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE01", res.getIdentifier("emoji_u1f201", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1e", res.getIdentifier("emoji_u1f51e", "drawable", pack));
        addPattern(emoticons, "\u26d4", res.getIdentifier("emoji_u26d4", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD92", res.getIdentifier("emoji_u1f192", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD97", res.getIdentifier("emoji_u1f197", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD95", res.getIdentifier("emoji_u1f195", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD98", res.getIdentifier("emoji_u1f198", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD99", res.getIdentifier("emoji_u1f199", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD93", res.getIdentifier("emoji_u1f193", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD96", res.getIdentifier("emoji_u1f196", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD9a", res.getIdentifier("emoji_u1f19a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE32", res.getIdentifier("emoji_u1f232", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE33", res.getIdentifier("emoji_u1f233", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE34", res.getIdentifier("emoji_u1f234", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE35", res.getIdentifier("emoji_u1f235", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE36", res.getIdentifier("emoji_u1f236", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE37", res.getIdentifier("emoji_u1f237", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE38", res.getIdentifier("emoji_u1f238", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE39", res.getIdentifier("emoji_u1f239", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE02", res.getIdentifier("emoji_u1f202", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE3a", res.getIdentifier("emoji_u1f23a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE50", res.getIdentifier("emoji_u1f250", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE51", res.getIdentifier("emoji_u1f251", "drawable", pack));
        addPattern(emoticons, "\u3299", res.getIdentifier("emoji_u3299", "drawable", pack));
        addPattern(emoticons, "\u00ae", res.getIdentifier("emoji_u00ae", "drawable", pack));
        addPattern(emoticons, "\u00a9", res.getIdentifier("emoji_u00a9", "drawable", pack));
        addPattern(emoticons, "\u2122", res.getIdentifier("emoji_u2122", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE1a", res.getIdentifier("emoji_u1f21a", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDE2f", res.getIdentifier("emoji_u1f22f", "drawable", pack));
        addPattern(emoticons, "\u3297", res.getIdentifier("emoji_u3297", "drawable", pack));
        addPattern(emoticons, "\u2b55", res.getIdentifier("emoji_u2b55", "drawable", pack));
        addPattern(emoticons, "\u274c", res.getIdentifier("emoji_u274c", "drawable", pack));
        addPattern(emoticons, "\u274e", res.getIdentifier("emoji_u274e", "drawable", pack));
        addPattern(emoticons, "\u2139", res.getIdentifier("emoji_u2139", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDEab", res.getIdentifier("emoji_u1f6ab", "drawable", pack));
        addPattern(emoticons, "\u2705", res.getIdentifier("emoji_u2705", "drawable", pack));
        addPattern(emoticons, "\u2714", res.getIdentifier("emoji_u2714", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD17", res.getIdentifier("emoji_u1f517", "drawable", pack));
        addPattern(emoticons, "\u2734", res.getIdentifier("emoji_u2734", "drawable", pack));
        addPattern(emoticons, "\u2795", res.getIdentifier("emoji_u2795", "drawable", pack));
        addPattern(emoticons, "\u2796", res.getIdentifier("emoji_u2796", "drawable", pack));
        addPattern(emoticons, "\u2716", res.getIdentifier("emoji_u2716", "drawable", pack));
        addPattern(emoticons, "\u2797", res.getIdentifier("emoji_u2797", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa0", res.getIdentifier("emoji_u1f4a0", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa1", res.getIdentifier("emoji_u1f4a1", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa4", res.getIdentifier("emoji_u1f4a4", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa2", res.getIdentifier("emoji_u1f4a2", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD25", res.getIdentifier("emoji_u1f525", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa5", res.getIdentifier("emoji_u1f4a5", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa6", res.getIdentifier("emoji_u1f4a6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCa8", res.getIdentifier("emoji_u1f4a8", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCab", res.getIdentifier("emoji_u1f4ab", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5b", res.getIdentifier("emoji_u1f55b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD67", res.getIdentifier("emoji_u1f567", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD50", res.getIdentifier("emoji_u1f550", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5c", res.getIdentifier("emoji_u1f55c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD51", res.getIdentifier("emoji_u1f551", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5d", res.getIdentifier("emoji_u1f55d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD52", res.getIdentifier("emoji_u1f552", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5e", res.getIdentifier("emoji_u1f55e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD53", res.getIdentifier("emoji_u1f553", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5f", res.getIdentifier("emoji_u1f55f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD54", res.getIdentifier("emoji_u1f554", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD60", res.getIdentifier("emoji_u1f560", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD54", res.getIdentifier("emoji_u1f555", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD61", res.getIdentifier("emoji_u1f561", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD56", res.getIdentifier("emoji_u1f556", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD62", res.getIdentifier("emoji_u1f562", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD57", res.getIdentifier("emoji_u1f557", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD63", res.getIdentifier("emoji_u1f563", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD58", res.getIdentifier("emoji_u1f558", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD64", res.getIdentifier("emoji_u1f564", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD59", res.getIdentifier("emoji_u1f559", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD65", res.getIdentifier("emoji_u1f565", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD5a", res.getIdentifier("emoji_u1f55a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD66", res.getIdentifier("emoji_u1f566", "drawable", pack));
        addPattern(emoticons, "\u2195", res.getIdentifier("emoji_u2195", "drawable", pack));
        addPattern(emoticons, "\u2b06", res.getIdentifier("emoji_u2b06", "drawable", pack));
        addPattern(emoticons, "\u2197", res.getIdentifier("emoji_u2197", "drawable", pack));
        addPattern(emoticons, "\u27a1", res.getIdentifier("emoji_u27a1", "drawable", pack));
        addPattern(emoticons, "\u2198", res.getIdentifier("emoji_u2198", "drawable", pack));
        addPattern(emoticons, "\u2b07", res.getIdentifier("emoji_u2b07", "drawable", pack));
        addPattern(emoticons, "\u2199", res.getIdentifier("emoji_u2199", "drawable", pack));
        addPattern(emoticons, "\u2b05", res.getIdentifier("emoji_u2b05", "drawable", pack));
        addPattern(emoticons, "\u2196", res.getIdentifier("emoji_u2196", "drawable", pack));
        addPattern(emoticons, "\u2194", res.getIdentifier("emoji_u2194", "drawable", pack));
        addPattern(emoticons, "\u2934", res.getIdentifier("emoji_u2934", "drawable", pack));
        addPattern(emoticons, "\u2935", res.getIdentifier("emoji_u2935", "drawable", pack));
        addPattern(emoticons, "\u23ea", res.getIdentifier("emoji_u23ea", "drawable", pack));
        addPattern(emoticons, "\u23e9", res.getIdentifier("emoji_u23e9", "drawable", pack));
        addPattern(emoticons, "\u23eb", res.getIdentifier("emoji_u23eb", "drawable", pack));
        addPattern(emoticons, "\u23ec", res.getIdentifier("emoji_u23ec", "drawable", pack));
        addPattern(emoticons, "\u25c0", res.getIdentifier("emoji_u25c0", "drawable", pack));
        addPattern(emoticons, "\u25b6", res.getIdentifier("emoji_u25b6", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD3d", res.getIdentifier("emoji_u1f53d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD3c", res.getIdentifier("emoji_u1f53c", "drawable", pack));
        addPattern(emoticons, "\u2747", res.getIdentifier("emoji_u2747", "drawable", pack));
        addPattern(emoticons, "\u2728", res.getIdentifier("emoji_u2728", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD34", res.getIdentifier("emoji_u1f534", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD35", res.getIdentifier("emoji_u1f535", "drawable", pack));
        addPattern(emoticons, "\u26aa", res.getIdentifier("emoji_u26aa", "drawable", pack));
        addPattern(emoticons, "\u26ab", res.getIdentifier("emoji_u26ab", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD33", res.getIdentifier("emoji_u1f533", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD32", res.getIdentifier("emoji_u1f532", "drawable", pack));
        addPattern(emoticons, "\u2b50", res.getIdentifier("emoji_u2b50", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF1f", res.getIdentifier("emoji_u1f31f", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDF20", res.getIdentifier("emoji_u1f320", "drawable", pack));
        addPattern(emoticons, "\u25ab", res.getIdentifier("emoji_u25ab", "drawable", pack));
        addPattern(emoticons, "\u25aa", res.getIdentifier("emoji_u25aa", "drawable", pack));
        addPattern(emoticons, "\u25fd", res.getIdentifier("emoji_u25fd", "drawable", pack));
        addPattern(emoticons, "\u25fe", res.getIdentifier("emoji_u25fe", "drawable", pack));
        addPattern(emoticons, "\u25fc", res.getIdentifier("emoji_u25fc", "drawable", pack));
        addPattern(emoticons, "\u25fb", res.getIdentifier("emoji_u25fb", "drawable", pack));
        addPattern(emoticons, "\u2b1b", res.getIdentifier("emoji_u2b1b", "drawable", pack));
        addPattern(emoticons, "\u2b1c", res.getIdentifier("emoji_u2b1c", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD39", res.getIdentifier("emoji_u1f539", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD38", res.getIdentifier("emoji_u1f538", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD37", res.getIdentifier("emoji_u1f537", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD36", res.getIdentifier("emoji_u1f536", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD3a", res.getIdentifier("emoji_u1f53a", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD3b", res.getIdentifier("emoji_u1f53b", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD1f", res.getIdentifier("emoji_u1f51f", "drawable", pack));
        addPattern(emoticons, "\u2754", res.getIdentifier("emoji_u2754", "drawable", pack));
        addPattern(emoticons, "\u2753", res.getIdentifier("emoji_u2753", "drawable", pack));
        addPattern(emoticons, "\u2755", res.getIdentifier("emoji_u2755", "drawable", pack));
        addPattern(emoticons, "\u2757", res.getIdentifier("emoji_u2757", "drawable", pack));
        addPattern(emoticons, "\u203c", res.getIdentifier("emoji_u203c", "drawable", pack));
        addPattern(emoticons, "\u2049", res.getIdentifier("emoji_u2049", "drawable", pack));
        addPattern(emoticons, "\u3030", res.getIdentifier("emoji_u3030", "drawable", pack));
        addPattern(emoticons, "\u27b0", res.getIdentifier("emoji_u27b0", "drawable", pack));
        addPattern(emoticons, "\u2660", res.getIdentifier("emoji_u2660", "drawable", pack));
        addPattern(emoticons, "\u2665", res.getIdentifier("emoji_u2665", "drawable", pack));
        addPattern(emoticons, "\u2663", res.getIdentifier("emoji_u2663", "drawable", pack));
        addPattern(emoticons, "\u2666", res.getIdentifier("emoji_u2666", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD94", res.getIdentifier("emoji_u1f194", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD11", res.getIdentifier("emoji_u1f511", "drawable", pack));
        addPattern(emoticons, "\u21a9", res.getIdentifier("emoji_u21a9", "drawable", pack));
        addPattern(emoticons, "\uD83C\uDD91", res.getIdentifier("emoji_u1f191", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD0d", res.getIdentifier("emoji_u1f50d", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD12", res.getIdentifier("emoji_u1f512", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD13", res.getIdentifier("emoji_u1f513", "drawable", pack));
        addPattern(emoticons, "\u21aa", res.getIdentifier("emoji_u21aa", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD10", res.getIdentifier("emoji_u1f510", "drawable", pack));
        addPattern(emoticons, "\u2611", res.getIdentifier("emoji_u2611", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD18", res.getIdentifier("emoji_u1f518", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD0e", res.getIdentifier("emoji_u1f50e", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD16", res.getIdentifier("emoji_u1f516", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD0f", res.getIdentifier("emoji_u1f50f", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD03", res.getIdentifier("emoji_u1f503", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD00", res.getIdentifier("emoji_u1f500", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD01", res.getIdentifier("emoji_u1f501", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD02", res.getIdentifier("emoji_u1f502", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD04", res.getIdentifier("emoji_u1f504", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDCe7", res.getIdentifier("emoji_u1f4e7", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD05", res.getIdentifier("emoji_u1f505", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD06", res.getIdentifier("emoji_u1f506", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD07", res.getIdentifier("emoji_u1f507", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD08", res.getIdentifier("emoji_u1f508", "drawable", pack));
        addPattern(emoticons, "\uD83D\uDD09", res.getIdentifier("emoji_u1f509", "drawable", pack));

        if (!ios) {
            addPattern(emoticons, "\uD83C\uDFa6", res.getIdentifier("emoji_u1f3a6", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDE9e", res.getIdentifier("emoji_u1f69e", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDC24", res.getIdentifier("emoji_u1f424", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDE01", res.getIdentifier("emoji_u1f601", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDE33", res.getIdentifier("emoji_u1f633", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDE83", res.getIdentifier("emoji_u1f683", "drawable", pack));
            addPattern(emoticons, "\u20e3", res.getIdentifier("emoji_u20e3", "drawable", pack));
            addPattern(emoticons, "\u26ce", res.getIdentifier("emoji_u26ce", "drawable", pack));
            addPattern(emoticons, "\u2733", res.getIdentifier("emoji_u2733", "drawable", pack));
            addPattern(emoticons, "\uD83D\uDD0a", res.getIdentifier("emoji_u1f50a", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDe6", res.getIdentifier("emoji_u1f1e6", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDe7", res.getIdentifier("emoji_u1f1e7", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDe8", res.getIdentifier("emoji_u1f1e8", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDe9", res.getIdentifier("emoji_u1f1e9", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDea", res.getIdentifier("emoji_u1f1ea", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDeb", res.getIdentifier("emoji_u1f1eb", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDec", res.getIdentifier("emoji_u1f1ec", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDed", res.getIdentifier("emoji_u1f1ed", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDee", res.getIdentifier("emoji_u1f1ee", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDef", res.getIdentifier("emoji_u1f1ef", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf0", res.getIdentifier("emoji_u1f1f0", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf1", res.getIdentifier("emoji_u1f1f1", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf2", res.getIdentifier("emoji_u1f1f2", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf3", res.getIdentifier("emoji_u1f1f3", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf4", res.getIdentifier("emoji_u1f1f4", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf5", res.getIdentifier("emoji_u1f1f5", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf6", res.getIdentifier("emoji_u1f1f6", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf7", res.getIdentifier("emoji_u1f1f7", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf8", res.getIdentifier("emoji_u1f1f8", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDf9", res.getIdentifier("emoji_u1f1f9", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDfa", res.getIdentifier("emoji_u1f1fa", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDfb", res.getIdentifier("emoji_u1f1fb", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDfc", res.getIdentifier("emoji_u1f1fc", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDfd", res.getIdentifier("emoji_u1f1fd", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDfe", res.getIdentifier("emoji_u1f1fe", "drawable", pack));
            addPattern(emoticons, "\uD83C\uDDff", res.getIdentifier("emoji_u1f1ff", "drawable", pack));
        }

        NatureEmojiAdapter.init(context);
        OtherEmojiAdapter.init(context);
        PeopleEmojiAdapter.init(context);
        ThingsEmojiAdapter.init(context);
        TransEmojiAdapter.init(context);

        textSize = (AppSettings.getInstance(context)).textSize;
    }

    public static int textSize;

    private static void addPattern(Map<Pattern, Integer> map, String smile, int resource) {
        map.put(Pattern.compile(Pattern.quote(smile)), resource);
    }

    public static boolean addSmiles(Context context, Spannable spannable) {
        boolean hasChanges = false;
        for (Map.Entry<Pattern, Integer> entry : emoticons.entrySet()) {
            Matcher matcher = entry.getKey().matcher(spannable);
            while (matcher.find()) {
                boolean set = true;
                for (ImageSpan span : spannable.getSpans(matcher.start(),
                        matcher.end(), ImageSpan.class))
                    if (spannable.getSpanStart(span) >= matcher.start()
                            && spannable.getSpanEnd(span) <= matcher.end())
                        spannable.removeSpan(span);
                    else {
                        set = false;
                        break;
                    }
                if (set) {
                    hasChanges = true;
                    int scale = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, textSize + 2, context.getResources().getDisplayMetrics());
                    try {
                        Bitmap bitmap = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(res, entry.getValue()), scale, scale, true);
                        spannable.setSpan(new ImageSpan(context, bitmap, ImageSpan.ALIGN_BOTTOM),
                                matcher.start(), matcher.end(),
                                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    } catch (OutOfMemoryError e) {
                        return false;
                    }

                }
            }
        }
        return hasChanges;
    }

    public static Spannable getSmiledText(Context context, CharSequence text) {
        try {
            Spannable spannable = spannableFactory.newSpannable(text);
            addSmiles(context, spannable);
            return spannable;
        } catch (Exception e) {
            e.printStackTrace();
            return new SpannableString("");
        }
    }

    public static boolean checkEmojisEnabled(Context context) {
        try {
            context.getPackageManager().getPackageInfo("com.klinker.android.emoji_keyboard_trial", PackageManager.GET_META_DATA);
            return true;
        } catch (Exception e) {
            try {
                context.getPackageManager().getPackageInfo("com.klinker.android.emoji_keyboard_trial_ios", PackageManager.GET_META_DATA);
                return true;
            } catch (Exception x) {
                return false;
            }
        }
    }
}
